set_reg_value(size, index, 0, regs, p->data);
}
break;
+
+ case INSTR_PUSH:
+ mmio_opp->addr += hvm_get_segment_base(current, x86_seg_ss);
+ hvm_copy_to_guest_virt(mmio_opp->addr, &p->data, size);
+ break;
}
}
mmio_op->instr = INSTR_SUB;
return DECODE_success;
+ case 6: /* push */
+ mmio_op->instr = INSTR_PUSH;
+ mmio_op->operand[0] = mmio_op->operand[1];
+ return DECODE_success;
+
default:
printk("%x/%x, This opcode isn't handled yet!\n",
*opcode, ins_subtype);
mmio_operands(IOREQ_TYPE_XOR, gpa, mmio_op, op_size);
break;
+ case INSTR_PUSH:
+ if ( ad_size == WORD )
+ {
+ mmio_op->addr = (uint16_t)(regs->esp - op_size);
+ regs->esp = mmio_op->addr | (regs->esp & ~0xffff);
+ }
+ else
+ {
+ regs->esp -= op_size;
+ mmio_op->addr = regs->esp;
+ }
+ /* send the request and wait for the value */
+ send_mmio_req(IOREQ_TYPE_COPY, gpa, 1, op_size, 0, IOREQ_READ, df, 0);
+ break;
+
case INSTR_CMP: /* Pass through */
case INSTR_TEST:
case INSTR_SUB:
static void vlapic_read_aligned(struct vlapic *vlapic, unsigned int offset,
unsigned int len, unsigned int *result)
{
- ASSERT((len == 4) && (offset > 0) && (offset <= APIC_TDCR));
+ ASSERT((len == 4) && (offset >= 0) && (offset <= APIC_TDCR));
switch ( offset )
{